/*
 * @Author:  请求封装
 * @Date: 2021-03-18 10:26:09
 * @LastEditTime: 2021-03-19 16:53:21
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: \adminc:\Users\dell\Desktop\react (1)\my-app\src\http\index.js
 */
import React from 'react'

import axios from 'axios';
import url from './urlConfig'
import { Toast } from 'antd-mobile';

// console.log(url)
let http = axios.create({
  timeout: 10000
});
let loadCount = 0
//防止重复提交ajax
let CancelToken = axios.CancelToken;
let sources = [];
/**
 * 请求防抖当一个url地址被请求多次就会取消前一次请求
 */
let removeSource = (config) => {
  for (let source in sources) {
    // 当多次请求相同时，取消之前的请求
    if (sources[source].umet === config.url + '&' + config.method) {
      sources[source].cancel("取消请求")
      sources.splice(source, 1)
    }
  }
};
/**
 * 请求拦截器
 */
http.interceptors.request.use(config => {
  // console.log(config, url[config.url])
  config.url = url[config.url];
  config.headers.token = localStorage.getItem('defaultBodyToken');
  config.headers.accountToken = localStorage.getItem('token');
  config.headers.version = localStorage.getItem('version');
  config.headers.source = 3;

  if (config.params && !config.params.isLoad) {
    loadCount++;
    Toast.loading('加载中...', 0)
  }

  removeSource(config)
  config.cancelToken = new CancelToken((c) => {
    // 将取消函数存起来
    sources.push({ umet: config.url + '&' + config.method, cancel: c })
  });
  return config;
}, error => {
  return Promise.reject(error)
}
);
// 响应拦截器
http.interceptors.response.use(config => {
  // if (config.data.statusCode >= 3000) {
  //   Toast.show({ content: config.data.msg, stayTime })
  // }
  loadCount--;
  if (loadCount >= 0) {
    Toast.hide()
  }

  removeSource(config.config)
  return config.data;
}, error => {
  loadCount--;
  if (loadCount >= 0) {
    Toast.hide()
  }

  if (!error.response) return
  switch (error.response.status) {
    // 401: 未登录
    // 未登录则跳转登录页面，并携带当前页面的路径
    // 在登录成功后返回当前页面，这一步需要在登录页操作。                
    case 401:
      // if (window.location.hostname === "localhost") {
      //     axios.post("/api/v1/login?client_name=form", {
      //         "userName": "lixiaoyao4_vendor",
      //         "password": 123456
      //     })
      // } else {
      //     window.location = error.response.headers.locationurl;
      // }
      break;

    // 403 token过期
    // 登录过期对用户进行提示
    // 清除本地token和清空vuex中token对象
    // 跳转登录页面                
    case 403:
      // Toast.show({ content: "登录过期，请重新登录", stayTime })
      // 跳转登录页面，并将要浏览的页面fullPath传过去，登录成功后跳转需要访问的页面 
      // if (window.location.hostname === "localhost") {
      //     axios.post("/api/v1/login?client_name=form", {
      //         "userName": "lixiaoyao4_vendor",
      //         "password": 123456
      //     })
      // } else {
      //     window.location = error.response.headers.locationurl;
      // }
      break;

    // 404请求不存在
    case 404:
      // Toast.show({ content: "访问资源不存在", stayTime })
      break;
    // 其他错误，直接抛出错误提示
    default:
    // Toast.show({ content: error.response.data.message, stayTime })
  }
  return Promise.reject(error.response)
}
)
// 对外暴露
window.$http = http;
React['$http'] = http;
